/*
 * Copyright (C) 2012 POAS.VSTU
 */

package model;

import ui.UIGamer;
import ui.UIPlayer;

import javax.swing.event.EventListenerList;

/**
 * Абстрактный класс игрока.
 */
public abstract class Player {

    /// Имя игрока
    private String mName;

    /// Карты игрока
    private PlayerCardPile mCards;

    /// Представление игрока
    private UIPlayer mUIPlayer;

    /// Игровая модель
    private GameModel mGameModel;

    /// Список слушателей событий
    protected EventListenerList listenerList = new EventListenerList();

    /**
     * Конструктор игрока.
     * @param name имя игрока
     * @param gm игровая модель
     */
    public Player(String name, GameModel gm) {
        this.mGameModel = gm;
        this.mName = name;
        mCards = new PlayerCardPile();
    }

    /**
     * Конструктор игрока.
     * @param name имя игрока
     */
    public Player(String name) {
        this(name, null);
    }

    /** Имя игрока. */
    public String getName() {
        return mName;
    }

    /** Игровая модель. */
    public GameModel getModel() {
        return mGameModel;
    }

    /** Задать имя игрока. */
    public void setName(String newName) {
        mName = newName;
    }

    /** Карты игрока. */
    public PlayerCardPile getCards() {
        return mCards;
    }

    /** Представить игрока в виде строки. */
    @Override
    public String toString() {
        String string = getName() + ":" + getCards().size() + "\n";
        for (Card c: getCards()) {
            string += "\n" + c;
        }
        return string;
    }

    /** Игрок верит. */
    public void believe() {

    }
    /** Игрок не верит. */
    public void disbelieve() {

    }

    /** Завершение хода игрока. */
    public void endTurn() {
        firePlayerTurnEndedEvent();
    }

    /** Начать заход. */
    public void beginRound() {
        mUIPlayer.startRound();
        firePlayerTurnStartedEvent();
    }

    /** Продолжить заход. */
    public void proceedRound() {
        mUIPlayer.continueRound();
        firePlayerTurnStartedEvent();
    }

    /** Завершить ход. */
    public void endRound() {
        getUI().endTurn();
        firePlayerRoundEndedEvent();
    }

    public void setUI(UIPlayer uiPlayer) {
        mUIPlayer = uiPlayer;
    }

    public UIPlayer getUI () {
        return mUIPlayer;
    }

    /** Испустить событие Игрок начал ход. */
    public void firePlayerTurnStartedEvent() {
        GameProcessEvent event = GameProcessEvent.playerTurnStarted(this, this);
        Object[] listeners = listenerList.getListeners(GameProcessEventListener.class);
        for (int i = 0; i < listeners.length; i++) {
            ((GameProcessEventListener)listeners[i]).playerTurnStarted(event);
        }
    }

    /** Испустить событие Игрок закончил ход. */
    public void firePlayerTurnEndedEvent() {
        GameProcessEvent event = GameProcessEvent.playerTurnEnded(this, this);
        Object[] listeners = listenerList.getListeners(GameProcessEventListener.class);
        for (int i = 0; i < listeners.length; i++) {
            ((GameProcessEventListener)listeners[i]).playerTurnEnded(event);
        }
    }

    /** Испустить событие Игрок закончил заход. */
    public void firePlayerRoundEndedEvent() {
        GameProcessEvent event = GameProcessEvent.playerRoundEnded(this, this);
        Object[] listeners = listenerList.getListeners(GameProcessEventListener.class);
        for (int i = 0; i < listeners.length; i++) {
            ((GameProcessEventListener)listeners[i]).playerRoundEnded(event);
        }
    }

    /**
     * Добавить слушателя событий.
     * @param l добавляемый слушатель событий
     */
    public void addGameProcessEventListener(GameProcessEventListener l) {
        listenerList.add(GameProcessEventListener.class, l);
    }

    /**
     * Удаление слушателя событий.
     * @param l слушатель, которого нужно забыть
     */
    public void removeGameProcessEventListener(GameProcessEventListener l) {
        listenerList.remove(GameProcessEventListener.class, l);
    }
}
